home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / oper_sys / emerald / emrldsys.lha / Language / Compiler / display.c < prev    next >
C/C++ Source or Header  |  1990-08-16  |  9KB  |  362 lines

  1. /*
  2.  * @(#)display.c    1.7  3/16/88
  3.  */
  4. #include "assert.h"
  5. #include "nodes.h"
  6. #include "MyParser.h"
  7. #include "opNames.h"
  8. #include "map.h"
  9. #include "sequence.h"
  10. #include "environment.h"
  11. #include "system.h"
  12.  
  13. static char *BLANKS = "        ";
  14. static char *TABS = "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t";
  15.  
  16. #define Indent(File, N) fprintf(File, "%.*s%.*s",\
  17.   (N) >> 3, TABS, (N) & 07, BLANKS)
  18. #define NLIndent(File, N) fprintf(File, "\n%.*s%.*s",\
  19.   (N) >> 3, TABS, (N) & 07, BLANKS)
  20.  
  21. static Map displayMap = NULL;
  22. static void rDisplayTree(), inner_rDisplaySymbol();
  23. static int vLevel;
  24.  
  25. void DisplayTree(fp, t, verboseLevel, maxLevel)
  26. FILE *fp;
  27. NodePtr t;
  28. int verboseLevel, maxLevel;
  29. {
  30.   displayMap = Map_Create();
  31.   vLevel = verboseLevel;
  32.   rDisplayTree(fp, t, 0, maxLevel);
  33.   fprintf(fp, "\n");
  34.   if (fflush(fp) == EOF) assert(FALSE);
  35.   Map_Destroy(displayMap);
  36. }
  37.  
  38. extern char *addressToString();
  39.  
  40. static void inner_rDisplaySymbol(fp, s, indent, maxLevel)
  41. FILE *fp;
  42. register Symbol s;
  43. int indent, maxLevel;
  44. {
  45.   if (s == NULL) {
  46.     fprintf(fp, " NULL");
  47.     return;
  48.   }
  49.   if (Map_Lookup(displayMap, (int)s) != NIL) {
  50.     fprintf(fp, " Symbol *0x%x %s%s%s", s, ST_KindName[(int)s->itsKind],
  51.       s->isManifest ? " (iM)" : "", s->hasValue ? " (hV)" : "");
  52.     return;
  53.   } else {
  54.     Map_Insert(displayMap, (int)s, 1);
  55.     fprintf(fp, " Symbol  0x%x %s%s%s", s, ST_KindName[(int)s->itsKind],
  56.       s->isManifest ? " (iM)" : "", s->hasValue ? " (hV)" : "");
  57.     NLIndent(fp, indent);
  58.     fprintf(fp, "address = %s", addressToString(s->v.address));
  59.     if (vLevel > 0) {
  60.       NLIndent(fp, indent);
  61.       fprintf(fp, "AT ");
  62.       rDisplayTree(fp, s->value.ATinfo, indent+3, maxLevel);
  63.       NLIndent(fp, indent);
  64.       fprintf(fp, "CT ");
  65.       rDisplayTree(fp, s->value.CTinfo, indent+3, maxLevel);
  66.       NLIndent(fp, indent);
  67.       fprintf(fp, "V  ");
  68.       rDisplayTree(fp, s->value.value, indent+3, maxLevel);
  69.     }
  70.   }
  71. }
  72.  
  73. #define rDisplaySymbol(fp, sn, indent, maxLevel) inner_rDisplaySymbol(fp, \
  74.   (sn) == 0 ? NULL : ST_Fetch(sn), indent, maxLevel)
  75.  
  76. static void rDisplayTree(fp, t, indent, maxLevel)
  77. FILE *fp;
  78. NodePtr t;
  79. int indent;
  80. int maxLevel;
  81. {
  82.   register int i;
  83.   Symbol st;
  84.  
  85.   maxLevel --;
  86.   if (t == NULL) {
  87.     fprintf(fp, "NULL");
  88.   } else if ((int)t < 0x200) {
  89.     /* it is probably an input token */
  90.     fprintf(fp, " Input token \"%s\" (%d)", TOKENNAME(t), (int)t);
  91.   } else if (Map_Lookup(displayMap, (int)t) != NIL) {
  92.     fprintf(fp, "*0x%x %s", t, tagNames[(int)t->tag]);
  93.     switch (t->tag) {
  94.       case T_IDENT:
  95.     fprintf(fp, " \"%s\" (%d)", Ident_Name(t->b.ident.ident), 
  96.       t->b.ident.ident);
  97.     break;
  98.       case P_BUILTINLIT:
  99.     fprintf(fp, " \"%s\" (%d)", 
  100.       TOKENNAME(t->b.builtinlit.whichType),
  101.       t->b.builtinlit.whichType);
  102.     break;
  103.       case P_BOOLLIT:
  104.     fprintf(fp, " \"%s\"", 
  105.       t->b.boollit.value ? "true" : "false");
  106.     break;
  107.       case P_GLOBALREF:
  108.     fprintf(fp, " id = 0x%x", t->b.globalref.id);
  109.     break;
  110.       case P_SYMREF:
  111.       case P_SYMDEF:
  112.       case P_SYMBOL:
  113.     if (t->tag == P_SYMBOL) {
  114.       st = (Symbol) t;
  115.     } else {
  116.       st = t->b.symref.symbol;
  117.     }
  118.     fprintf(fp, " \"%s\" #%d", 
  119.       st == NULL ? Ident_Name(t->b.symref.ident) : ST_SymbolName(st),
  120.       st == NULL ? -1 : st->itsSymbolNumber);
  121.     break;
  122.       case P_ATLIT:
  123.       case P_OBLIT:
  124.     if (t->b.atlit.f.immutable) fprintf(fp, " (immutable)");
  125.     if (t->b.atlit.f.writeSeparately) fprintf(fp, " (wS)");
  126.     if (t->b.atlit.f.isTypeVariable) fprintf(fp, " (tV)");
  127.     if (t->b.atlit.f.dependsOnTypeVariable) fprintf(fp, " (dTV)");
  128.     if (t->b.atlit.f.inExecutableConstruct) fprintf(fp, " (iEC)");
  129.     if (t->b.atlit.f.isManifest) fprintf(fp, " (iM)");
  130.     if (t->b.atlit.f.typesAreAssigned) fprintf(fp, " (tAA)");
  131.     if (t->b.atlit.f.typesHaveBeenChecked) fprintf(fp, " (tHBC)");
  132.     if (t->b.atlit.id != 0) fprintf(fp, " (%08x)", t->b.atlit.id);
  133.     if (getCodeOID(t) != 0) fprintf(fp, " code oid = 0x%x",getCodeOID(t));
  134.     break;
  135.       case P_OPSIG:
  136.     if (t->b.opsig.isFunction) fprintf(fp, " (function)");
  137.     break;
  138.       case P_OPNAME:
  139.     fprintf(fp, " %x %s",
  140.       t->b.opname.id,
  141.       t->b.opname.id == 0 ?
  142.       Ident_Name(t->b.opname.ident) :
  143.       ON_Name(t->b.opname.id));
  144.     break;
  145.       default:
  146.     break;
  147.     }
  148.     return;
  149.   } else {
  150.     Map_Insert(displayMap, (int)t, 1);
  151.     fprintf(fp, " 0x%x %s", t, tagNames[(int)t->tag]);
  152.     switch (t->tag) {
  153.       case T_STRING:
  154.       case P_STRINGLIT:
  155.       case P_CHARLIT:
  156.       case P_INTLIT:
  157.       case P_REALLIT:
  158.     fprintf(fp, " \"%s\"", t->b.string.string);
  159.     break;
  160.       case T_IDENT:
  161.     fprintf(fp, " \"%s\" (%d)", Ident_Name(t->b.ident.ident), 
  162.       t->b.ident.ident);
  163.     break;
  164.       case P_BUILTINLIT:
  165.     fprintf(fp, " \"%s\" (%d)", 
  166.       TOKENNAME(t->b.builtinlit.whichType),
  167.       t->b.builtinlit.whichType);
  168.     break;
  169.       case P_BOOLLIT:
  170.     fprintf(fp, " \"%s\"", 
  171.       t->b.boollit.value ? "true" : "false");
  172.     break;
  173.       case P_FIELDREF:
  174.     fprintf(fp, " \"%s\"", 
  175.       Ident_Name(t->b.fieldref.ident));
  176.     break;
  177.       case P_GLOBALREF:
  178.     fprintf(fp, " id = 0x%x", t->b.globalref.id);
  179.     if (vLevel > 2) {
  180.       NLIndent(fp, indent);
  181.       fprintf(fp, "v");
  182.       resolveGlobal(t, (ValuePtr)NULL);
  183.       rDisplayTree(fp, t->b.globalref.value, indent+1, maxLevel);
  184.     }
  185.     break;
  186.       case P_SYMREF:
  187.       case P_SYMDEF:
  188.       case P_SYMBOL:
  189.     if (t->tag == P_SYMBOL) {
  190.       st = (Symbol) t;
  191.     } else {
  192.       st = t->b.symref.symbol;
  193.     }
  194.     fprintf(fp, " \"%s\" #%d", 
  195.       st == NULL ? Ident_Name(t->b.symref.ident) : ST_SymbolName(st),
  196.       st == NULL ? -1 : st->itsSymbolNumber);
  197.     NLIndent(fp, indent+1);
  198.     rDisplaySymbol(fp, st, indent+1, maxLevel);
  199.     break;
  200.       case P_ATLIT:
  201.       case P_OBLIT:
  202.     if (t->b.atlit.f.immutable) fprintf(fp, " (immutable)");
  203.     if (t->b.atlit.f.writeSeparately) fprintf(fp, " (wS)");
  204.     if (t->b.atlit.f.isTypeVariable) fprintf(fp, " (tV)");
  205.     if (t->b.atlit.f.dependsOnTypeVariable) fprintf(fp, " (dTV)");
  206.     if (t->b.atlit.f.inExecutableConstruct) fprintf(fp, " (iEC)");
  207.     if (t->b.atlit.f.isManifest) fprintf(fp, " (iM)");
  208.     if (t->b.atlit.f.typesAreAssigned) fprintf(fp, " (tAA)");
  209.     if (t->b.atlit.f.typesHaveBeenChecked) fprintf(fp, " (tHBC)");
  210.     if (t->b.atlit.id != 0) fprintf(fp, " (%08x)", t->b.atlit.id);
  211.     if (getCodeOID(t) != 0) fprintf(fp, " code oid = 0x%x",getCodeOID(t));
  212.     if (t->b.atlit.f.isManifest && (t->b.atlit.id & 0xffffff) <= (OID)0x000100)
  213.       return;
  214.     break;
  215.       case P_OPSIG:
  216.     if (t->b.opsig.isFunction == FALSE) ;
  217.     else if (t->b.opsig.isFunction == TRUE)
  218.       fprintf(fp, " (function)");
  219.     else fprintf(fp, " (garbage)");
  220.     break;
  221.       case P_OPNAME:
  222.     fprintf(fp, " %x %s",
  223.       t->b.opname.id,
  224.       t->b.opname.id == 0 ?
  225.       Ident_Name(t->b.opname.ident) : 
  226.          ON_Name(t->b.opname.id));
  227.     break;
  228.       case P_PARAM:
  229.       case P_ARG:
  230.     if (t->b.param.move) fprintf(fp, " move");
  231.     break;
  232.       default:
  233.     break;
  234.     }
  235.     if (maxLevel <= 0) return;
  236.     if (t->tag == P_SYMBOL) return;
  237.     for (i = t->firstChild; i < t->nChildren; i++) {
  238.       NLIndent(fp, indent);
  239.       fprintf(fp, "%c", i < 10 ? i + '0' : i < 36 ? i + 'a' - 10 : 
  240.     i < 62 ? i + 'A' - 36 : '*');
  241.       rDisplayTree(fp, t->b.children[i], indent+1, maxLevel);
  242.     }
  243.   }
  244. }
  245.  
  246. void ShowTree(t, verboseLevel, maxLevel)
  247. int t;
  248. int verboseLevel;
  249. int maxLevel;
  250. {
  251.   DisplayTree(stdout, (NodePtr)t, verboseLevel, maxLevel);
  252. }
  253.  
  254. #define NBUFFERS 8
  255. static char buffers[NBUFFERS][132];
  256. static int lastBuffer = NBUFFERS-1;
  257. #define NEXTBUFFER() (buffers[((++lastBuffer) % NBUFFERS)])
  258.  
  259. char *showExpression(t)
  260. NodePtr t;
  261. {
  262.   char *buffer = NEXTBUFFER();
  263.   if (t == NN) {
  264.     sprintf(buffer, "NULL");
  265.   } else if ((int)t <= 0x200) {
  266.     sprintf(buffer, "%s", TOKENNAME(t));
  267.   } else {
  268.     switch (t->tag) {
  269.       case P_SYMREF:
  270.     sprintf(buffer, "%s",
  271.       t->b.symref.symbol == NULL ? 
  272.         Ident_Name(t->b.symref.ident) :
  273.         ST_SymbolName(t->b.symref.symbol));
  274.     break;
  275.       case P_BUILTINLIT:
  276.     sprintf(buffer, "%s", TOKENNAME(t->b.builtinlit.whichType));
  277.     break;
  278.       case P_INVOC:
  279.     sprintf(buffer, "??.%s%s", t->b.invoc.opname->b.opname.id == 0 ?
  280.       Ident_Name(t->b.invoc.opname->b.opname.ident) :
  281.       ON_Name(t->b.invoc.opname->b.opname.id),
  282.       t->b.invoc.args == NULL ? "" : "[??]");
  283.     break;
  284.       default:
  285.     sprintf(buffer, "unknown");
  286.     break;
  287.     }
  288.   }
  289.   return(buffer);
  290. }
  291.  
  292. char *showInvoc(t)
  293. NodePtr t;
  294. {
  295.   char *buffer = NEXTBUFFER(), *b;
  296.   assert(t->tag == P_INVOC);
  297.   b = showExpression(t->b.invoc.target);
  298.   strcpy(buffer, b);
  299.   strcat(buffer, ".");
  300.   strcat(buffer, t->b.invoc.opname->b.opname.id == 0 ?
  301.     Ident_Name(t->b.invoc.opname->b.opname.ident) :
  302.     ON_Name(t->b.invoc.opname->b.opname.id));
  303.   return(buffer);
  304. }
  305.  
  306. char *NameOf(p)
  307. register NodePtr p;
  308. {
  309.   register Symbol st;
  310.   st = p->b.atlit.name->b.symdef.symbol;
  311.   return(ST_SymbolName(st));
  312. }
  313.  
  314.  
  315. char *ATName(p)
  316. register NodePtr p;
  317. {
  318.   register Symbol st;
  319.   NodePtr q;
  320.   char *sp = NEXTBUFFER();
  321.   if (p == NULL) {
  322.     strcpy(sp, "<unknown>");
  323.   } else if (p->tag == T_SEQUENCE) {
  324.     strcpy(sp, "{ ");
  325.     Sequence_For(q, p)
  326.       if (z__z > 0) strcat(sp, ", ");
  327.       strcat(sp, ATName(q));
  328.     Sequence_Next
  329.     strcat(sp, " }");
  330.   } else {
  331.     st = p->b.atlit.name->b.symdef.symbol;
  332.     sprintf(sp, "\"%s\" (0x%08x)", ST_SymbolName(st), p->b.atlit.id);
  333.   }
  334.   return(sp);
  335. }
  336.  
  337. char *STName(st)
  338. register Symbol st;
  339. {
  340.   char *sp = NEXTBUFFER();
  341.   sprintf(sp, "\"%s\" (%08x)", ST_SymbolName(st), st);
  342.   return(sp);
  343. }
  344.  
  345. char *SigName(p)
  346. NodePtr p;
  347. {
  348.   return(ON_Name((p)->b.opsig.name->b.opname.id));
  349. }
  350.  
  351. void ShowExpression(t)
  352. int t;
  353. {
  354.   fprintf(stdout, "%s\n", showExpression((NodePtr)t));
  355. }
  356.  
  357. void ShowInvoc(t)
  358. int t;
  359. {
  360.   fprintf(stdout, "%s\n", showInvoc((NodePtr)t));
  361. }
  362.